package main

import "fmt"

// 定义，未来结构体如果要使用，就要有这些数据，数据集合
// type 定义新的类型，类型名称User
type User struct { // 结构体要在包外使用，其类型名称首字母要大写
	// 字段 field、属性property
	Id    int // 属性名，在保外要使用该字段，注意首字母要大写
	name  string
	score float32
}

func main() {
	// 用 user 这个类型定义新的变量，这些变量都是 user 类型的
	// 1
	var u1 User // 零值, 在内存中构建出来 user 对应的机构，零值大胆用，字段都是零值
	fmt.Printf("%T \n", u1)
	fmt.Println(u1)         // 缺省类型打印
	fmt.Printf("%v\n", u1)  // 缺省类型实现，go 语言源码已经实现了结构体类型缺省打印方式
	fmt.Printf("%+v\n", u1) // 带字段，详细打印
	fmt.Printf("%#v\n", u1) //更详细打印

	// 2 字面量
	var u2 = User{} // user是类型, {} 表示字面量书写
	fmt.Printf("%T \n", u2)
	fmt.Printf("%#v\n", u2)

	//
	u3 := User{1, "yzy", 23} // 采用这个方式，必须给所有字段赋值
	fmt.Printf("%T %+[1]v\n", u3)

	u4 := User{Id: 100} // 如果字面量定义时，使用字段给值，可以不给出所有字段
	fmt.Printf("%T %+[1]v\n", u4)

	u5 := User{name: "tom", score: 78.5, Id: 200}
	fmt.Printf("%T %+[1]v\n", u5)
	fmt.Println(u5.Id, u5.name, u5.score)
	u5.score += 20
	fmt.Println(u5.score)
}
